#include "TMedio.h"

int Medio_Crear(TMedio* medio) {
		medio->cantidad_placas_conectadas = 0;
		return MEDIO_OK;
}

int Medio_Destruir(TMedio* medio) {
	int i;
	if (medio->cantidad_placas_conectadas) {
        for (i = 0; i < medio->cantidad_placas_conectadas; i++) {
            Placa_Destruir(medio->placas_conectadas[i]);
        }
	}

	return MEDIO_OK;
}

size_t Medio_ContarConectadas(TMedio* medio) {
	return (size_t)medio->cantidad_placas_conectadas;
}

int Medio_Transmitir(TMedio* medio, void* mensaje, size_t tam) {
	int i, errores = 0;

	for (i = 0; i < medio->cantidad_placas_conectadas; i++) {
		errores += Placa_Recibir(medio->placas_conectadas[i], mensaje, tam);

		#ifdef __DEBUG__
        printf("Medio_Transmitir:\n Mensaje Enviado/Recibido. \n");
        #endif

	}

	if (errores) {
		return MEDIO_ERR_TRANSMITIR;
	}
	else {
		return MEDIO_OK;
	}
}

int Medio_Conectar(TMedio* medio, TPlaca* placa) {
	int i;

	if (medio->cantidad_placas_conectadas) {
		for (i = 0; i < medio->cantidad_placas_conectadas; i++) {
			if (Placa_GetDireccion(medio->placas_conectadas[i]) == Placa_GetDireccion(placa)) {
				return MEDIO_ERR_PLACA_CONECTADA;
			}
		}
  }

  medio->placas_conectadas[medio->cantidad_placas_conectadas] = placa;
  (medio->cantidad_placas_conectadas)++;
  return MEDIO_OK;
}

int Medio_Desconectar (TMedio* medio, TPlaca* placa) {
    int a, b, i;
	a = 0;
	b = 1;
	if (MEDIO_DEBUG) printf ("Entra al Medio_Desconectar\n");
	while ((a < medio->cantidad_placas_conectadas - 1) && b) {
		if (Placa_GetDireccion(medio->placas_conectadas[a]) == Placa_GetDireccion(placa)) {
		    if (MEDIO_DEBUG) printf("Encontro placa en Medio_Desconectar");
		    Placa_Destruir(medio->placas_conectadas[a]);
            for (i = a; i < medio->cantidad_placas_conectadas; i++) {
                medio->placas_conectadas[i] = medio->placas_conectadas[i + 1];
            }
            (medio->cantidad_placas_conectadas)--;
            b = 0;
            return MEDIO_OK; /*Si la encontro, retorna OK*/
        }
        a++;
	}
    if (b) {
        if (MEDIO_DEBUG) printf ("Entra si no fue encontrada la placa");
        if (Placa_GetDireccion(medio->placas_conectadas[a]) == Placa_GetDireccion(placa)) {
            if (MEDIO_DEBUG) printf ("Encontro la placa en la ultima celda");
            Placa_Destruir(medio->placas_conectadas[a]);
            medio->placas_conectadas[a] = NULL;
            medio->cantidad_placas_conectadas--;
            b = 0;
        }
        else
            return MEDIO_ERR_PLACA_CONECTADA; /*Si no la encontró, retorna ERROR*/
    }

    return MEDIO_OK;
}
